#include "DllParser.hpp"

void TestDllParser()
{
	// 打印当前工作目录
	char currentDir[MAX_PATH];
	GetCurrentDirectoryA(MAX_PATH, currentDir);
	std::cout << "Current working directory: " << currentDir << std::endl;

	// 获取可执行文件的完整路径
	char exePath[MAX_PATH];
	GetModuleFileNameA(NULL, exePath, MAX_PATH);
	std::cout << "Executable path: " << exePath << std::endl;

	DllParser dllParser("MyDLL.dll");

	int a = 5;
	int b = 8;
	// 将int(const int &, const int &) 重定义一个名字
	// 主要是函数类型是int(const int &, const int &)
	//函数指针类型是这个 int(*)(const int &, const int &)。
	// 只有函数指针类型才可以声明的变量才可以直接调用
	using MaxFunc = int(const int &, const int &);
	using AddFunc = int(int &, int &);
	auto max = dllParser.ExecuteFunc<MaxFunc>("Max", a, b);
	auto add = dllParser.ExecuteFunc<AddFunc>("Add", a, b);
	// auto max2 = dllParser.ExecuteFunc("Max", a, b);
	//  auto add2 = dllParser.ExecuteFunc("Add", a, b);

	std::cout << "Max: " << max << std::endl;
	std::cout << "Add: " << add << std::endl;

	// 增加 BindFunction 方法
	MaxFunc *max2 = dllParser.GetFunction<MaxFunc>("Max");
	MaxFunc *add2 = dllParser.GetFunction<MaxFunc>("Add");

	// 调用 max2 和 add2
	int max2_result = max2(a, b);
	int add2_result = add2(a, b);

	std::cout << "Max2: " << max2_result << std::endl;
	std::cout << "Add2: " << add2_result << std::endl;
	// std::cout << "Max2: " << max2 << std::endl;
	// std::cout << "Add2: " << add2 << std::endl;

	return;
}

int main(void)
{
	TestDllParser();

	return 0;
}